home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
source
/
swagg-m
/
memory.swg
/
0059_256k Memory in BASM.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-08-24
|
3KB
|
101 lines
{
CF> Ok I know in pascal you can basiclly us up t0 64k for varibles.... But how
CF> can I set it up to use... lets say 256k for varibles. I mean, -XMS-
CF> memeory? =- Chris Forbis
First, you may allocate 256k without XMS. Just using the following routines:
function DosMaxAvail : longint;
function MemAlloc(Size : longint) : pointer;
function MemFree(P : pointer) : integer;
function MemRealloc(P : pointer; NewSize : longint) : integer;
}
Function DosMaxAvail : longint; assembler;
{ Returns the size of the largest contiguous free memory block
This function should be called ONLY when both HeapMin/HeapMax
memory allocation parameters set to zero }
Asm
MOV BX,0FFFFh
MOV AH,48h
INT 21h
MOV AX,BX
MOV BX,16
MUL BX
End; { DosMaxAvail }
Function MemAlloc(Size : longint) : pointer; assembler;
{ Creates a dynamic variable of the specified size and returns the pointer
to it. This function should be called ONLY when both HeapMin/HeapMax
memory allocation parameters set to zero }
Asm
@@1:
MOV AX,WORD PTR [Size]
MOV DX,WORD PTR [Size+2]
MOV CX,16
DIV CX
INC AX
MOV BX,AX
MOV AH,48h
INT 21h
JNC @@2
XOR AX,AX
@@2:
MOV DX,AX
XOR AX,AX
End; { MemAlloc }
Procedure MemFree(P : pointer); assembler;
{ Disposes of a given dynamic variable. This function should be called ONLY
when both HeapMin/HeapMax memory allocation parameters set to zero }
Asm
MOV ES,WORD PTR [P+2]
MOV AH,49h
INT 21h
End; { MemFree }
Function MemRealloc(P : pointer; NewSize : longint) : pointer; assembler;
{ Changes the size of en existed memory block. This function should be called
ONLY when both HeapMin/HeapMax memory allocation parameters set to zero }
Asm
@@1:
MOV AX,WORD PTR [NewSize]
PUSH AX
MOV DX,WORD PTR [NewSize+2]
PUSH DX
MOV CX,16
DIV CX
INC AX
MOV BX,AX
MOV AH,4Ah
INT 21h
POP DX
POP AX
JNC @@2
XOR DX,DX
XOR AX,AX
@@2:
End; { MemRealloc }
{ Okey, the main program: }
{$M 4096,0,0}
const MemToAlloc = 256 * 1024; { 256k }
var MemoryBlock : pointer;
Begin
if DosMaxAvail >= MemToAlloc then
begin
WriteLn('Dos free memory before allocating ',
MemToAlloc shr 10, 'kb: ', DosMaxAvail shr 10, 'kb.');
MemoryBlock := MemAlloc(MemToAlloc);
WriteLn('Dos free memory after allocating ',
MemToAlloc shr 10, 'kb: ', DosMaxAvail shr 10, 'kb.');
{ if MemoryBlock = nil then report an error... }
MemFree(MemoryBlock)
end else WriteLn('Not enough memory. ',
(MemToAlloc - DosMaxAvail) shr 10, 'kb more needed.')
End.